// function sayHello(person:string){
//     return 'Hello ' + person
// }
// let user = 'Waston'
// let x: [string, number]
// // x = ['nos', 19]
// x = ['hello', 10];
// // x[3] = 'world'; 
// // console.log(x[5].toString());
// // document.write(x[3])
// // console.log(x[1].substr(1))
// // console.log(sayHello(user))
// // document.body.innerHTML = sayHello(user);
// // enum color {Red=2,Green,Blue} 
// // let c :color = color.Blue
// // let cn :string= color[3]
// // let anc :any = 'Tom'
// // let obj:　Object = 3
// // console.log(obj)
// // console.log(anc.firstName)
// // console.log(c)
// // console.log(cn)
// // let arra : any[]=[1,'2990','sac',true]
// // arra[1] = 1000
// // console.log(arra)
// function sumMatrix(matrix: number[][]) {
//     let sum = 0;
//     for (let i = 0; i < matrix.length; i++) {
//         var currentRow = matrix[i];
//         for (let i = 0; i < currentRow.length; i++) {
//             sum += currentRow[i];
//         }
//     }

//     return sum;
// }
// let matrix = [[1,4,6,8],[2,5,7,8]]
// let a= sumMatrix(matrix)
// console.log(a)

// interface SquareConfig {
//     color?: string;
//     width?: number;
//   }
  
//   function createSquare(config: SquareConfig): {color: string; area: number} {
//     let newSquare = {color: "white", area: 100};
//     if (config.color) {
//       newSquare.color = config.color;
//     }
//     if (config.width) {
//       newSquare.area = config.width * config.width;
//     }
//     return newSquare;
//   }
  
//   let mySquare = createSquare({color: "black"});
//   console.log(mySquare)

// interface SearchFunc {
//     (source: string, subString: string): boolean;
//   }
// let mySearch: SearchFunc;
// mySearch = function(srce: string, sub: string):boolean {
//   let result = srce.search(sub);
//   if (result == -1) {
//     return false;
//   }
//   else {
//     return 'ww';
//   }
// }
// mySearch('wret','d')
// let a = mySearch('wret','t')

// console.log(a)

// class Animal {
//     name:string
// }
// class Dog extends Animal {
//     breed:string
// }
// interface NotOkay {
//     [x:number]:Animal,
//     [x:string]:Dog
// }
// interface Person {
//     readonly id: number;
//     name: string;
//     age?: number;
//     [propName: string]: any;
// }

// let tom: Person = {
//     name: 'Tom',
//     gender: 'male'
// };

// tom.id = 89757;

// interface Counter {
//     (start: number): string;
//     interval: number;
//     reset(): void;
// }

// function getCounter(): Counter {
//     let counter = <Counter>function (start: number) { };
//     counter.interval = 123;
//     counter.reset = function () { };
//     return counter;
// }

// let c = getCounter();
// c(10);
// c.reset();
// c.interval = 5.0;
// console.log(c(10))
interface ClockConstructor {
    new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
    tick();
}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
    return new ctor(hour, minute);
}

class DigitalClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("beep beep");
    }
}
class AnalogClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("tick tock");
    }
}

let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);
console.log(digital)
console.log(analog)